Matriochka - Step 3 - Nuit du Hack CTF Quals 2016
#Nuit_du_Hack_CTF_Quals_2016
Ghidraに投げると以下のコードが得られる
code: c
int main(int argc,char **argv)
{
int iVar1;
__pid_t __pid;
int i;
if (argc == 2) {
strncpy(&DAT_006040c0,argv1,0x3ff);
__pid = getpid();
signal(0xb,FUN_004007fd);
signal(8,FUN_00401050);
i = 0;
while (i < 0x400) {
kill(__pid,0xb);
i = i + 1;
}
puts("Try again!");
iVar1 = 1;
}
else {
iVar1 = printf("Usage: %s <pass>\n",*argv);
}
return iVar1;
}
code: c
void FUN_004007fd(void)
{
int iVar1;
iVar1 = (DAT_006040c0 * 1000) / 0x44;
if ((999 < iVar1) && (iVar1 < 0x3e9)) {
signal(0xb,FUN_0040085c);
}
return;
}
繰り返しkillで自分にシグナルを送り、自分でハンドルしている
ハンドルする関数は複数存在し、フラグの自分が担当している部分が正しければ次の関数をシグナルハンドラーに登録する
フラグがすべて正しければ0除算をしてSIGFPEシグナルを送り、FUN_00401050を呼び出している
(999 < iVar1) && (iVar1 < 0x3e9)はiVar1 == 1000と同値なので、 iVar1 = (DAT_006040c0 * 1000) / 0x44;ならば0x44がフラグの文字である
すべてのハンドラー関数について確認すると、以下のコードでフラグが得られる
code: python
a = 0x44, 0x69, 100, 0x5f, 0x79, 0x6f, 0x75, 0x5f, 0x6c, 0x69, 0x6b, 0x65, 0x5f,0x73,0x69, 0x67, 0x6e, 0x61, 0x6c, 0x73, 0x3f
''.join(chr(i) for i in a)
Did_you_like_signals?